package com.zbc.config;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 避免前端精度丢失配置
 * 后端   --->   前端， Long / long   --->   String
 * 前端   --->   后端， String   --->   Long / long
 * 注意：
 * 1. 后端返回前端时，Long 类型会被序列化为 String 类型，避免精度丢失
 * 2. 前端提交后端时，String 类型会被反序列化为 Long 类型，避免精度丢失
 * @author fangyu
 * @version v1.0.0
 * @since 2025/9/2 01:05
 */
@Configuration
public class JacksonConfiguration {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            builder.serializerByType(Long.class, ToStringSerializer.instance) // 把 Long 类型序列化为 String(默认实现了, 也可以从配置文件开启)
                    .deserializerByType(Long.class, new StringToLongDeserializer()) // 把 String 类型反序列化为 Long
                    .deserializerByType(Long.TYPE, new StringToLongDeserializer()); // 把 String 类型反序列化为 long
        };
    }
}